<?php
/**
 * @link https://www.kancloud.cn/cleverstone/ymb2
 * @copyright Copyright (c) 2020 Yii Manager Software LLC
 */

namespace builder\form\util\control;

/**
 * 颜色选择器
 */
class Colorpicker extends Control
{
    /**
     * @var array
     */
    private $_options = [
        'control' => 'colorpicker',
        'label' => '',
        'default' => '', // 默认颜色值，值的格式跟随 format 属性的设定。
        'required' => false,
        'comment' => '',
        'help' => '',
        'layout' => 12,
        'style' => '',
        'class' => '',
        'attribute' => '',
        '_setting' => [
            // 颜色显示/输入格式，支持 hex rgb 。 若同时开启 alpha 属性，则颜色值自动变为 rgba。
            'format' => 'hex',
            // 是否开启透明度。当同时开启 format: 'rgb' 时，color 值将采用 rgba 格式。
            'alpha' => false,
            // 是否开启预定义颜色栏
            'predefine' => false,
            // 设置可选的颜色列表，需开启 predefine: true 有效。
            'colors' => [],
            // 颜色框的尺寸，可选值： lg sm xs
            'size' => 'sm',
        ],
        '_change_handler' => null,
        '_cancel_handler' => null,
        '_close_handler' => null,
    ];

    /**
     * ```php
     * $closeHandler = <<<JS
     *      return function(value){
     *          console.log(value); // 当前颜色值
     *      }
     * JS;
     *  event_close($closeHandler);
     * ```
     * @param string $closeHandler 颜色选择面板被关闭后即触发。
     * @return $this
     * @see builder/assets/ym2/ym2.bootstrap.js 637:11
     */
    public function event_close(string $closeHandler): Colorpicker
    {
        $this->_options['_close_handler'] = $closeHandler;
        return $this;
    }

    /**
     * ```php
     * $cancelHandler = <<<JS
     *      return function(value){
     *          console.log(value); // 当前颜色值
     *      }
     * JS;
     * event_cancel($cancelHandler);
     * ```
     * @param string $cancelHandler 取消颜色选择的回调函数，一般点击非颜色选择面板区域触发。
     * @return $this
     * @see builder/assets/ym2/ym2.bootstrap.js 637:11
     */
    public function event_cancel(string $cancelHandler): Colorpicker
    {
        $this->_options['_cancel_handler'] = $cancelHandler;
        return $this;
    }

    /**
     * ```php
     * $changeHandler = <<<JS
     *      return function(value){
     *          console.log(value); // 当前颜色值
     *      }
     * JS;
     * event_change($changeHandler);
     * ```
     * @param string $changeHandler 颜色被改变的回调函数。
     * @return $this
     * @see builder/assets/ym2/ym2.bootstrap.js 637:11
     */
    public function event_change(string $changeHandler): Colorpicker
    {
        $this->_options['_change_handler'] = $changeHandler;
        return $this;
    }

    /**
     * @param string $size 颜色框的尺寸，可选值： lg sm xs
     * @return $this
     */
    public function setting_size(string $size)
    {
        $this->_options['_setting']['size'] = $size;
        return $this;
    }

    /**
     * @param array $colorLists 设置可选的颜色列表，需开启 predefine: true 有效。
     * @return $this
     */
    public function setting_colors(array $colorLists)
    {
        $this->_options['_setting']['colors'] = $colorLists;
        return $this;
    }

    /**
     * @param bool $predefine 是否开启预定义颜色栏
     * @return $this
     */
    public function setting_predefine(bool $predefine)
    {
        $this->_options['_setting']['predefine'] = $predefine;
        return $this;
    }

    /**
     * @param bool $alpha 是否开启透明度。当同时开启 format: 'rgb' 时，color 值将采用 rgba 格式。
     * @return $this
     */
    public function setting_alpha(bool $alpha)
    {
        $this->_options['_setting']['alpha'] = $alpha;
        return $this;
    }

    /**
     * @param string $format 颜色显示/输入格式，支持 hex rgb 。
     * @return $this
     */
    public function setting_format(string $format)
    {
        $this->_options['_setting']['format'] = $format;
        return $this;
    }

    /**
     * 控件标签
     * @param string|null $label
     * @return $this
     */
    public function label($label)
    {
        $this->_options['label'] = $label;
        return $this;
    }

    /**
     * 默认值
     * @param string $default
     * @return $this
     */
    public function defaultValue($default)
    {
        $this->_options['default'] = (string)$default;
        return $this;
    }

    /**
     * 是否必填
     * @param bool $required
     * @return $this
     */
    public function required($required = true)
    {
        $this->_options['required'] = (boolean)$required;
        return $this;
    }

    /**
     * 字段注释
     * @param string $comment
     * @return $this
     */
    public function comment($comment)
    {
        $this->_options['comment'] = (string)$comment;
        return $this;
    }

    /**
     * 帮助文字
     * @param string $help
     * @return $this
     */
    public function help($help)
    {
        $this->_options['help'] = (string)$help;
        return $this;
    }

    /**
     * 布局，1-12
     * @param int $layout
     * @return $this
     */
    public function layout($layout)
    {
        $this->_options['layout'] = (int)$layout;
        return $this;
    }

    /**
     * CSS样式
     * @param array|string $style
     * @return $this
     */
    public function style($style)
    {
        $this->formatStyle($style);
        $this->_options['style'] = $style;

        return $this;
    }

    /**
     * UI
     * @param array|string $class
     * @return $this
     */
    public function uiClass($class)
    {
        $this->formatUiClass($class);
        $this->_options['class'] = $class;

        return $this;
    }

    /**
     * HTML属性
     * @param array|string $attribute
     * @return $this
     */
    public function attribute($attribute)
    {
        $this->formatHtmlAttribute($attribute);
        $this->_options['attribute'] = $attribute;

        return $this;
    }

    /**
     * @return array
     */
    public function _toArray()
    {
        return $this->_options;
    }
}